package com.unitd.frame.mybatis.plugin.pagination.executor;

import com.unitd.frame.mybatis.plugin.pagination.comm.Page;
import com.unitd.frame.mybatis.plugin.pagination.comm.PageParams;

import java.util.List;

/**
 * @desc 自定义的分页线程对象类, 用于处理分页查询调用
 * @filename PageExecutor.java
 * @copyright www.unitd.com
 * @author Hudan
 * @version 1.0
 * @date 2017/2/5
 */
public class PageExecutor {

	private static ThreadLocal<PageParams> pageParamsHolder = new ThreadLocal<>();

	/**
	 * @desc 自定义的分页数据加载接口, 分页查询需要实现此类的接口方法
	 * @filename PageDataLoader.java
	 * @copyright www.unitd.com
	 * @author Hudan
	 * @version 1.0
	 * @date 2017/12/21
	 */
	public static interface PageDataLoader<T> {

		/**
		 * @desc 需要进行具体分页的查询对象,分页查询需要实现此方法,用于加载需要分页的数据
		 * @return List
		 */
		List<T> load();
	}

	/**
	 * @desc 执行分页查询
	 * @param pageParams 分页参数
	 * @param dataLoader 分页数据加载对象
	 * @param <T> 需要进行分页的数据对象类型
	 * @return T
	 */
	@SuppressWarnings("unchecked")
	public static <T> Page<T> pagination(PageParams pageParams, PageDataLoader<T> dataLoader) {
		pageParamsHolder.set(pageParams);
		List<T> list = dataLoader.load();
		if(list!=null && list.size()>0) {
			return (Page<T>) list.get(0);
		} else {
			return null;
		}
	}

	public static PageParams getPageParams() {
		return pageParamsHolder.get();
	}

	public static void clearPageParams() {
		pageParamsHolder.remove();
	}
}